/**
 * @file   hamilton.hpp
 * @author Kimmo Luoma <kimmo@PHOTON3>
 * @date   Fri Sep 14 13:30:57 2012
 * 
 * @brief  Class for Hamiltonian
 * 
 * Hamiltonian for the system. Templated on channels class.
 *
 *
 */
#ifndef HAMILTON_HPP
#define HAMILTON_HPP

#include <boost/numeric/ublas/matrix.hpp>
#include <boost/numeric/ublas/vector.hpp>
#include <complex>
//#include "channels.hpp"

using namespace boost::numeric::ublas;

class  hamilton{
private:
  matrix<double > H_;
public:
  /** 
   * Default constructor
   * 
   * 
   * @return hamilton 
   */
  hamilton();
  
  /** 
   * Constructor
   * 
   * @param H Hamiltonian matrix
   * 
   * @return hamilton
   */
  hamilton(matrix<double> H);
  
  /** 
   * Copy constructor 
   * 
   * @param h 
   */
  hamilton(const hamilton& h);
  
  /** 
   * Copy assignment 
   * 
   * @param h 
   * 
   * @return reference
   */
  hamilton& operator=(const hamilton& h);

  /** 
   * Destructor
   * 
   * 
   * @return 
   */
  ~hamilton();
  
  /** 
   * Operator() which return Hamiltonian at time t
   * 
   * 
   *
   * @return Hamiltonian matrix
   */
  matrix<double> operator()();
  //vector<std::complex<double> > operator*(matrix<std::complex<double> > h,
  //					  vector<std::complex<double> > psi);
  /** 
   * Return hamiltonian matrix
   * 
   * 
   * @return hamiltonian matrix
   */
  matrix<double> get_op();
};
#endif
